package main

import (
	"fmt"
	"strconv"
)

func main() {
	/*1、整型之间的转换*/
	var a int8 = 5
	var b = int16(a)
	fmt.Println(b)

	/*2、整型和浮点类型的相互转换*/
	var c int = 6
	var d = float32(c) //整型转浮点类型
	fmt.Println(d)

	var e float32 = 3.14
	f := int(e) //浮点类型转整型
	fmt.Println(f)

	/*3、自定义类型别名转换*/
	type jiang int8 // 自定义了一个jiang类型，底层试试int8，但和int8为两个类型，体现了go数据类型的严谨
	var k jiang = 9
	var l = int(k)
	fmt.Println(l)

	/*4、字符类型和整型之间相互转换*/
	//字符转化整型，函数strconv.Atoi()，输出结果为转化后的整型和是否存在报错，正常转化报错就是nil
	var p = "12"
	//由于字符整型可以报错，"12将" 这种就转不了，当存在中英文字符的时候转换就会报错，输出一个非nil的值，所以这一类的转换需要抛出异常
	var q, err = strconv.Atoi(p)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(q)

	//整型转化字符，strconv.Itoa()，该函数的输出为字符转，这里不存在转化报错
	var u = 36
	var G = strconv.Itoa(u)
	fmt.Println(G)

	/*5、字符串转其他类型*/
	//字符串转浮点类型，ParseFloat(字符串, 位数32或64) ---->返回(浮点float64, 转换报错信息，没报错就nil)
	var ak = "3.1415"
	fk, err := strconv.ParseFloat(ak, 32)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(strconv.ParseFloat(ak, 32))
	fmt.Println(fk)

	//字符转浮点类型，除了上面的函数还有ParseInt(字符串, 进制(10进制，8进制等), 位数) ----> 返回(int64, err error)
	//需要进制转换可以用这个，不然用strconv.Atoi()更方便
	var lk = "36"
	jk, err := strconv.ParseInt(lk, 10, 64)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(jk)
	fmt.Println(strconv.ParseInt(lk, 10, 32))

	//字符转化为bool类型, ParseBool(str string)
	/*
		当字符串为："1", "t", "T", "true", "TRUE", "True"  ---->转化后都返回 return true, nil
		当字符串为："0", "f", "F", "false", "FALSE", "False"  ---->转化后都返回 return false, nil
	*/
	var an = "true"
	gj, err := strconv.ParseBool(an)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(gj)

	//字符串转为rune切片类型，当字符串中含有中文，无论是获取字符串长度还是遍历字符串都要这样做
	str17 := "hello 世界"
	runeArray := []rune(str17)                    //转化为rune切片，
	fmt.Println("runeArray: ", runeArray)         // 每个字符的Unicode [104 101 108 108 111 32 19990 30028]
	fmt.Println("runeArray: ", string(runeArray)) //rune又转为字符串
	fmt.Println(len(runeArray))                   //打印含有中文字符串的长度

	/*6、其他类型转化为字符串类型*/
	//布尔类型转化为字符串
	var kh = true
	ck := strconv.FormatBool(kh)
	fmt.Println(ck)
	//整型转化为字符串,strconv.FormatInt(整型(64位),进制位数)，将整型按其他进制计算之后的字符串
	var dk int64 = -42
	kb := strconv.FormatInt(dk, 16)
	fmt.Println(kb)
	//浮点类型转换为字符串,FormatFloat(要转化的浮点值, 转化后的输出格式(看源码), 特殊精度一般用-1, 位数)
	var df = 3.1456
	yh := strconv.FormatFloat(df, 'f', -1, 64)
	fmt.Println(yh)

}
